package com.ty.skysystem.service.impl;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ty.skysystem.dao.SysMenuDao;
import com.ty.skysystem.entity.SysMenu;
import com.ty.skysystem.entity.vo.MenuNodeVO;
import com.ty.skysystem.service.SysMenuService;
import java.util.ArrayList;
import java.util.List;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;

/** @author Mjg @QQ:2091864671 @Creates by mjg ON 2020/12/22-12:55 */
@Service
@Slf4j
public class SysMenuServiceImpl extends ServiceImpl<SysMenuDao, SysMenu> implements SysMenuService {
  /**
   * 构建多级菜单树
   *
   * @param nodes
   * @return
   */
  public static List<MenuNodeVO> build(List<MenuNodeVO> nodes) {
    // 根节点
    List<MenuNodeVO> rootMenu = new ArrayList<>();
    for (MenuNodeVO nav : nodes) {
      if (nav.getParentId() == 0) {
        rootMenu.add(nav);
      }
    }
    /* 根据Menu类的order排序 */
    rootMenu.sort(MenuNodeVO.order());
    /*为根菜单设置子菜单，getChild是递归调用的*/
    for (MenuNodeVO nav : rootMenu) {
      /* 获取根节点下的所有子节点 使用getChild方法*/
      List<MenuNodeVO> childList = getChild(nav.getMenuId(), nodes);
      nav.setChildren(childList); // 给根节点设置子节点
    }
    return rootMenu;
  }

  /**
   * 获取子菜单
   *
   * @param id 根id
   * @param nodes
   * @return
   */
  private static List<MenuNodeVO> getChild(Integer id, List<MenuNodeVO> nodes) {
    // 子菜单
    List<MenuNodeVO> childList = new ArrayList<>();
    for (MenuNodeVO nav : nodes) {
      // 遍历所有节点，将所有菜单的父id与传过来的根节点的id比较
      // 相等说明：为该根节点的子节点。
      if (nav.getParentId().equals(id)) {
        childList.add(nav);
      }
    }
    // 递归
    for (MenuNodeVO nav : childList) {
      nav.setChildren(getChild(nav.getMenuId(), nodes));
    }
    childList.sort(MenuNodeVO.order()); // 排序
    // 如果节点下没有子节点，返回一个空List（递归退出）
    if (childList.size() == 0) {
      return new ArrayList<>();
    }
    return childList;
  }

  @Override
  public List<SysMenu> list(Wrapper<SysMenu> queryWrapper) {

    return this.baseMapper.selectList(null);
  }

  /**
   * 找到菜单树
   *
   * @return {@link List<MenuNodeVO>}
   */
  @Override
  public List<MenuNodeVO> findMenuTree() {
    List<SysMenu> sysMenus = this.baseMapper.selectList(null);
    List<MenuNodeVO> menuNodeVOS = new ArrayList<>();
    if (!sysMenus.isEmpty()) {
      for (SysMenu sysMenu : sysMenus) {
        if (sysMenu.getType() == 0) {
          MenuNodeVO menuNodeVO = new MenuNodeVO();
          BeanUtils.copyProperties(sysMenu, menuNodeVO);
          menuNodeVOS.add(menuNodeVO);
        }
      }
    }
    return build(menuNodeVOS);
  }

  @Override
  public List<MenuNodeVO> findMenuTreeByUserId(Long userId) {
    return this.baseMapper.findMenuTreeByUserId(userId);
  }
}
